# coding: utf-8
# 这段代码主要演示了如何使用Python的numpy、matplotlib和scipy库来生成一个正态分布的样本数据集，
# 并计算其统计特征（均值、中位数、众数、偏度和峰度），最后将这些统计特征显示在直方图上。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import mode
import scipy.stats as sts
import math

plt.rcParams['font.sans-serif'] = ['SimHei']  #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  #用来正常显示负号

# 设置正态分布的均值（mu）和标准差（sigma），然后生成一个包含580000个样本的正态分布数据集，并将每个样本四舍五入到小数点后两位。
mu = 0.0
sigma = 1.0
samples = np.around(np.random.normal(loc=mu, scale=sigma, size=580000), 2)
# 创建一个新的图形，设置其编号为1，DPI（每英寸点数）为300，以确保图形的高质量
plt.figure(num=1, dpi=300)

# plt.title(u'正态分布', size=14)
# plt.xlabel(u'数值', size=14)
# 设置Y轴标签为“频数”，并使用直方图显示样本数据，设置直方图的箱数为1300，显示范围为-5到5。
plt.ylabel(u'频数', size=14)
plt.hist(samples, bins=1300, range=(-5, 5))
# plt.text(4.5,900, r'$\mu$ = 0.0, $\sigma$ = 2.0', size=12)

# 计算样本的均值、中位数、众数、偏度和峰度，并将均值和中位数四舍五入到小数点后两位。
n_mean = np.round(np.mean(samples), 2)
n_median = np.round(np.median(samples), 2)
n_mode = mode(samples)
n_Skewness, n_kurtosis = sts.describe(samples)[4:]

# print samples
print(u'均值:%.2f;中位数：%.2f;众数：%.2f(%.0f次)' % (n_mean, n_median, n_mode.mode, n_mode.count))
print(u'偏度:%.2f;峰度：%.2f' % (n_Skewness, n_kurtosis))
# plt.grid(True)
plt.text(-5, 2100, u'均值:%.2f;中位数：%.2f;众数：%.2f' % (n_mean, n_median, n_mode.mode), size=8)
plt.text(-5, 2000, u'偏度:%.4f;峰度：%.4f' % (n_Skewness, n_kurtosis), size=8)

plt.show()
print(sts.describe(samples))
